package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @ClassName Reflection
 * @PackageName reflection
 * @projectName myThread
 * @Description 
 * @Author games
 * @Date 2025/8/29 上午11:31
 * @Version 1.0
 */
public class ReflectionUseExample {

    /**
     * 框架开发：如Spring的依赖注入、ORM框架等
     * 序列化/反序列化：如JSON解析库
     * 动态代理：如JDK动态代理
     * 配置文件解析：通过配置创建对象实例
     * 单元测试：访问私有方法和字段进行测试
     *
     * @param args
     * @throws NoSuchMethodException
     * @throws NoSuchFieldException
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException, ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException {
        // 方式一：通过类名.class获取
        Class<?> clazz = String.class;
        System.out.println(clazz);


        // 通过构造方法创建实例
        Constructor<?> constructor = clazz.getConstructor();
        Object instance = constructor.newInstance();

        // 或者直接创建实例（适用于有无参构造方法的情况）
        //Object instance = clazz.newInstance(); // 已废弃

        Field field = clazz.getDeclaredField("fieldName");
        field.setAccessible(true); // 设置可访问private字段

        // 获取字段值
        Object value = field.get(instance);

        // 设置字段值
        field.set(instance, "newValue");


        Method method = clazz.getDeclaredMethod("methodName", String.class);
        method.setAccessible(true); // 如果是private方法

        // 调用方法
        Object result = method.invoke(instance, "parameter");

    }
}
